package system

import (
	"fmt"
	"time"

	"github.com/robfig/cron/v3"
	"go-api-template/api/models"
	"gorm.io/gorm"
)

// CronExpr 定时任务表
type CronExpr struct {
	models.BaseModel
	Name         string       `gorm:"column:name"`           // 定时任务名称
	CreateUserId string       `gorm:"column:create_user_id"` // 创建者ID
	ApiId        string       `gorm:"column:api_id"`         // 系统接口表ID
	ParamJson    string       `gorm:"column:param_json"`     // 接口参数
	EntryId      cron.EntryID `gorm:"column:entry_id"`       // 程序内定时任务ID
	Type         int          `gorm:"column:type"`           // 类型（1:单次任务 2:周期任务）

	Expression  string `gorm:"column:expression"`   // 定时任务表达式
	Cycle       int8   `gorm:"column:cycle"`        // 周期频率 1分 2时 3日 4月 5周
	ExprMinute  int    `gorm:"column:expr_minute"`  // 分钟 取值0~59
	ExprHour    int    `gorm:"column:expr_hour"`    // 小时 取值0~23
	ExprDay     int    `gorm:"column:expr_day"`     // 日 取值范围1~31
	ExprMonth   int    `gorm:"column:expr_month"`   // 月 取值范围1~12
	ExprWeek    int    `gorm:"column:expr_week"`    // 周 取值范围1~53
	ExecuteTime int    `gorm:"column:execute_time"` // 执行时间

	StartTime int  `gorm:"column:start_time"` // 定时任务执行时间段的开始时间
	EndTime   int  `gorm:"column:end_time"`   // 定时任务执行时间段的截止时间
	Status    int8 `gorm:"column:status"`     // 状态 1正在运行 2暂停 3结束
}

func (*CronExpr) TableName() string {
	return "system_cron_expr"
}

// SetExpression 设置表达式
func (c *CronExpr) SetExpression() {
	executeTime := time.Unix(int64(c.ExecuteTime), 0)
	fmt.Printf("%+v\n", executeTime)
	c.Expression = fmt.Sprintf(`%d %d `, executeTime.Minute(), executeTime.Hour())

	switch c.Cycle {
	// 周期日
	case 3:
		c.Expression = c.Expression + `* * *`
	// 周期周
	case 4:
		c.Expression = c.Expression + fmt.Sprintf(`* * %d`, c.ExprWeek)
	// 周期月
	case 5:
		c.Expression = c.Expression + fmt.Sprintf(`%d * *`, c.ExprDay)
	// 周期年
	case 6:
		c.Expression = c.Expression + fmt.Sprintf(`%d %d *`, c.ExprDay, c.ExprMonth)
	}
}

// SetNextExecuteTime 设置下次执行时间
func (c *CronExpr) SetNextExecuteTime() {
	switch c.Cycle {
	// 周期日
	case 3:
	// 周期周
	case 4:
		c.Expression = c.Expression + fmt.Sprintf(`* * %d`, c.ExprWeek)
	// 周期月
	case 5:
		c.Expression = c.Expression + fmt.Sprintf(`%d * *`, c.ExprDay)
	// 周期年
	case 6:
		c.Expression = c.Expression + fmt.Sprintf(`%d %d *`, c.ExprDay, c.ExprMonth)
	}
}

func (c *CronExpr) IsExit(tx *gorm.DB, crontabId int) (ok bool, err error) {
	ok = true
	err = tx.Debug().Model(c).Where(`id = ?`, crontabId).Scan(c).Error
	if err != nil {
		ok = false
		return
	} else if c.ID == "" {
		ok = false
		return
	}
	return
}
